//
// @Auther: by wujehy 
// @Email:wujehy@qq.com
// @Data:2020/9/11
// @Time:4:49 下午
//
//

#ifndef GEEJOAN_NETWORKPROTOCOL_H
#define GEEJOAN_NETWORKPROTOCOL_H

#include <string>

namespace GeeJoan
{

    //　数据体的最大长度
    const static int NETWORKPACKAGE_MAX_BODY_BUFFER_LEN = 4096;
    //  数据包　头部　长度
    const static int NETWORKPACKAGE_HEARDER_SIZE = 5;
    // 数据包最大buffer　长度　NETWORKPACKAGE_MAX_BODY_BUFFER_LEN　＋　NETWORKPACKAGE_HEARDER_SIZE
    const static int NETWORKPACKAGE_MAX_BUFFER_LEN = 4101;

    typedef union Buffer_Len_DataType{
        uint16_t len16 ;
        uint8_t  len8[2]; //　注意系统的大端小端　问题
    } Buffer_Len_DataType;

    struct HanderDataType
    {
        uint8_t clientid; ///<　服务端储存的客户端id编号
        uint8_t modtype; ///< 当前业务模块类型
        uint8_t subtype; ///< 业务子类型
        uint8_t ctaskid; ///< 客户端标记的任务id
        uint16_t msg_len;
        std::string message;
    };
    struct ResposeDataPackage
    {
        uint8_t modtype; ///< 当前业务模块类型
        uint8_t subtype; ///< 业务子类型
        uint8_t ctaskid; ///< 客户端标记的任务id
        uint8_t code; ///<　状态码
        uint16_t len; ///<　长度
        std::string message; ///<　数据
    };

    // 取值范围　0 ~ 255 uint8类型
    enum StatusCodeTypeEnum
    {
        Status_SUCCESS = 0,
        Status_FAIL = 1,
        Status_UNKNOW = 2,
    };
    // 网络协议 精简 为 前两个 8 bit 为业务 号 和子业务号
    enum ModTypeEnum
    {
        ModType_AuthMod = 1, //
        ModType_KeyValueMod = 2, //
        ModType_TestMod = 99, // 为了方便测试这个是 'c'
    };

    enum OpTestModSubTypeEnum
    {
        OpTestModSubType_Test1 = 97, // 同上 'a'
        OpTestModSubType_Test2 = 98, // 同上 'a'
        OpTestModSubType_Test3 = 99, // 同上 'a'
    };
    enum OpAuthModSubTypeEnum
    {
        OpAuthModSubType_Reset = 97, // 同上 'a'
    };

    enum OpKeyValueModSubTypeEnum
    {
        OpKeyValueModSubType_set = 1,
        OpKeyValueModSubType_get = 2,
        OpKeyValueModSubType_exist = 3,
    };
}
#endif //GEEJOAN_NETWORKPROTOCOL_H
